# -*- coding: utf-8 -*-
"""
Created on Mon Feb 11 15:36:43 2019

@author: user
"""

# 数据类型data type
# Numpy 内置多种数据类型：bool_、int_、int8、int16(32,64)、float_、float16(32,64)
# 使用时：np.float、np.int16等
# 创建data type：numpy.dtype(object, align, copy)

import numpy as np

# ndarray 的元素类型
# 整数数组默认的数据类型
arr = np.array([10, 20, 30])
print(arr.dtype)  # int32

# 小数数组默认的数据类型
float_arr = np.array([12.2, 13.4, 10.1])
print(float_arr.dtype) # float64

bool_arr = np.array([True, False])
print(bool_arr.dtype) # bool

# 修改默认数据类型
int64_arr = np.array([10, 20, 30], dtype = np.int64)
print(int64_arr.dtype) # int64

# 混合数组数据类型
mix_arr = np.array([True, 'test', 12, 12.3])
print(mix_arr.dtype) # <U5
print(mix_arr.size)


import numpy as np
# ndarray 为什么这么多元素类型？
# python语法仅支持整数int、浮点数float、复数complex三种类型
# 对元素精细定义：有助于提升存储和运算性能。
# 如：numpy合理使用存储空间，程序员对程序的合理评估

# 非同质：即没有对齐的多维数组
# 非同质的ndarray
x = np.array([[1,2], [2,3,4]])

print(x.dtype) # object

# 非同质ndarray元素为object类型
# 非同质ndarray对象无法有效发挥numpy优势，尽量避免


# 使用numpy内置类型

dt = np.dtype(np.int32)
print(dt) # int32

# i:int32，i1:int8，i2:int16
default_int = np.dtype('i')
print(default_int) # int32

# f:float32, f1: 没有, f2:float16
f2 = np.dtype('f2')
print(f2) # float16

# 创建结构化数据类型
struct_type = np.dtype([('age', np.int8)])
ages = np.array([10,20,30], dtype = struct_type)
print(ages)
print(ages['age'])